package 双周赛;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 */
public class 第112场双周赛 {

    public static void main(String[] args) {

    }

    /**
     * 枚举
     * 由于长度为 4 ，总共只有 4 种换位情况
     */
    public boolean canBeEqual(String s1, String s2) {
        if (s1.equals(s2)) {
            return true;
        }
        char[] chars = s1.toCharArray();
        if (("" + chars[2] + chars[1] + chars[0] + chars[3]).equals(s2)) {
            return true;
        }
        if (("" + chars[2] + chars[3] + chars[0] + chars[1]).equals(s2)) {
            return true;
        }
        if (("" + chars[0] + chars[3] + chars[2] + chars[1]).equals(s2)) {
            return true;
        }
        return false;
    }

    /**
     * 脑筋急转弯
     * 只要 s1 和 s2 的所有单数索引和双数索引
     * 统计的字母个数相同，就能通过任意次换位
     * 使得 s1 == s2
     */
    public boolean checkStrings(String s1, String s2) {
        int[] double1 = new int[26];
        int[] single1 = new int[26];
        int[] double2 = new int[26];
        int[] single2 = new int[26];

        for (int i = 0; i < s1.length(); i++) {
            if (i % 2 == 0) {
                double1[s1.charAt(i) - 'a']++;
                double2[s2.charAt(i) - 'a']++;
            } else {
                single1[s1.charAt(i) - 'a']++;
                single2[s2.charAt(i) - 'a']++;
            }
        }
        for (int i = 0; i < 26; i++) {
            if (double1[i] != double2[i] || single1[i] != single2[i]) {
                return false;
            }
        }
        return true;
    }

    /**
     * 双指针+哈希表+模拟
     */
    public long maxSum(List<Integer> nums, int m, int k) {
        long ans = 0;
        long curSum = 0;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < k; i++) {
            Integer num = nums.get(i);
            curSum += num;
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        if (map.size() >= m) {
            ans = curSum;
        }
        for (int i = k; i < nums.size(); i++) {
            int subNum = nums.get(i - k), addNum = nums.get(i);
            curSum -= subNum;
            curSum += addNum;

            Integer cnt = map.get(subNum);
            if (cnt == 1) {
                map.remove(subNum);
            } else {
                map.put(subNum, cnt - 1);
            }
            map.put(addNum, map.getOrDefault(addNum, 0) + 1);
            if (map.size() >= m) {
                ans = Math.max(ans, curSum);
            }
        }
        return ans;
    }

    // 背包问题
}
